<?php
// +----------------------------------------------------------------------
// | VueAdmin框架[基于ThinkPHP5开发]
// +----------------------------------------------------------------------
// | Copyright (c) 2016-2018 http://www.vueadmin.org
// +----------------------------------------------------------------------
// | VueAdmin承诺基础框架永久免费开源，您可用于学习和商用，但必须保留软件版权信息。
// +----------------------------------------------------------------------
// | Author: sept <917088650@qq.com>，开发者QQ群：63131383
// +----------------------------------------------------------------------

namespace app\system\model;


use app\lib\Auth\Auth;
use app\lib\exception\ApiException;
use app\lib\exception\ForbiddenException;
use app\lib\returnCode\Code;
use app\lib\returnCode\Msg;

class AdminRole extends Base
{
// 定义时间戳字段名
    protected $createTime = 'create_time';
    protected $updateTime = 'upload_time';

    // 自动写入时间戳
    protected $autoWriteTimestamp = true;

    public function storage($data,$id = 0) {

        //TODO 所有更新和创建的模型方法都合并成storage
        if (isset($id) && !empty($id)) {
            $res = $this->save($data,['id'=>$id]);
        } else {
            $res = $this->create($data);
        }

        return $res;

    }

    // 写入时，将权限ID转成JSON格式
    public function setAuthAttr($value)
    {
        return $value;
//        return json_encode($value);
    }

    /**
     * 删除角色
     * @param int $id 用户id
     * @author sept <917088650@qq.com>
     * @return bool
     * @throws ForbiddenException
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function del($id = 0)
    {
        if (is_array($id)) {
            foreach ($id as $k => $v) {
                if ($v == 1) {
                    throw new ApiException(Code::SYSTEM_DELETE_ADMINI_RULE,sprintf(Msg::SYSTEM_DELETE_ADMINI_RULE,$v));
                }

                // 判断是否有用户绑定此角色
                if (AdminUser::where('role_id', $v)->find()) {
                    throw new ApiException(Code::SYSTEM_DELETE_ADMIN_EXIT,sprintf(Msg::SYSTEM_DELETE_ADMIN_EXIT,$v));
                }
                $map = [];
                $map['id'] = $v;
                self::where($map)->delete();
            }
        } else {
            $id = (int)$id;

            if ($id == 1) {
                throw new ApiException(Code::SYSTEM_DELETE_ADMINI_RULE,Msg::SYSTEM_DELETE_ADMINI_RULE);
            }

            // 判断是否有用户绑定此组
            if (AdminUser::where('role_id', $id)->find()) {
                throw new ApiException(Code::SYSTEM_DELETE_ADMIN_EXIT,Msg::SYSTEM_DELETE_ADMIN_EXIT);
            }

            $map = [];
            $map['id'] = $id;
            self::where($map)->delete();
        }

        return true;
    }

    /**
     * 获取所有角色
     * @author sept <917088650@qq.com>
     * @return array
     */
    public static function getAll()
    {
        return self::column('id,name');
    }

    /**
     * 检查访问权限
     * @param int $id
     * @author sept <917088650@qq.com>
     * @return bool
     * @throws ForbiddenException
     */
    public static function checkAuth($id = 0)
    {
        $user = Auth::user();
        // 超级管理员直接返回true
        if ($user->id == '1' || $user->role_id == '1') {
            return true;
        }
        // 获取当前角色的权限明细
        $role_auth = (array)cache('role_auth_'.$user->role_id);

        if (!$role_auth) {
            $map = [];
            $map['id'] = $user['role_id'];
            $auth = self::where($map)->value('auth');
            if (!$auth) {
                throw new ApiException(Code::SYSTEM_POWER_ERROR,Msg::SYSTEM_POWER_ERROR);
            }
            $role_auth = json_decode($auth, true);
            // 非开发模式，缓存数据
            if (config('sys.app_debug') == 0) {
                cache('role_auth_'.$user['role_id'], $role_auth);
            }
        }
        if (!$role_auth) return false;
        return in_array($id, $role_auth);
    }
}